home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Franz PD / Franz PD Disk #047 (1990)(Amiga User Group Deutschland e.V.)[v Disaster Master 2].zip / Franz PD Disk #047 (1990)(Amiga User Group Deutschland e.V.)[v Disaster Master 2].adf / A68K_Beispiele / load.asm < prev    next >
Assembly Source File  |  1989-07-02  |  6KB  |  256 lines

  1. ***************************************
  2. *  LOAD from disk                     *
  3. *                                     *
  4. * written by E. Lenz                  *
  5. *            Johann-Fichte-Strasse 11 *
  6. *            8 Munich 40              *
  7. *            Germany                  *
  8. *                                     *
  9. ***************************************
  10.  
  11.     XDEF load,file
  12.  
  13.  
  14. ********LOAD SECTOR ABSOLUTE***********
  15. ;  INPUT
  16. ; d0 Pointer to disk buffer
  17. ; d1 Sector number
  18. ; d2 Unit number
  19. ; a0 Pointer to sector number in ASCII
  20. ;
  21.  
  22. *****EXEC**************
  23.  
  24. _AbsExecBase     equ 4
  25. _LVOAllocMem     equ -$c6
  26. _LVOAddPort      equ -$162
  27. _LVORemPort      equ -$168
  28. _LVOCloseLibrary equ -$19e
  29. _LVOOpenDevice   equ -$1bc
  30. _LVOCloseDevice  equ -$1c2
  31. _LVODoIo         equ -$1c8
  32. _LVOOpenLibrary  equ -$228
  33.  
  34. *******DOS******
  35.  
  36. _LVOOpen        equ -$1e
  37. _LVOClose       equ -$24
  38. _LVORead        equ -$2a
  39. _LVOWrite       equ -$30
  40. _LVOOutput      equ -$3c
  41. _LVOLock        equ -$54
  42. _LVOUnLock      equ -$5a
  43. _LVOExamine     equ -$66
  44. _LVOLoadSeg     equ -$96
  45. _LVOUnLoadSeg   equ -$9c
  46.  
  47. ThisTask        equ $114
  48.  
  49. load      move.l  a0,-(a7)
  50.           move.w  d1,-(a7)
  51.           move.l  d2,-(a7)
  52.           movea.l d0,a5
  53.           movea.l _AbsExecBase,a6
  54.           move.l  ThisTask(a6),reply+$10
  55.  
  56.           lea     reply(pc),a1          add reply port
  57.           jsr     _LVOAddPort(a6)
  58.  
  59.           move.l  (a7)+,d0              unit number
  60.           moveq   #0,d1                 flags
  61.           lea     trddevice(pc),a0      device name
  62.           lea     diskio(pc),a1         iorequest
  63.           jsr     _LVOOpenDevice(a6)
  64.           tst.l   d0
  65.           bne     error
  66.  
  67.           lea     diskio(pc),a1
  68.           move.l  #reply,$e(a1)
  69.           move.w  #2,$1c(a1)   command read
  70.           move.l  a5,d0
  71.           addi.l  #$10,d0
  72.           move.l  d0,$28(a1)
  73.           move.l  #$400,$24(a1)
  74.           moveq   #0,d0        trackdisk offset sector number * 512
  75.           move.w  (a7)+,d0
  76.           mulu    #512,d0
  77.           move.l  d0,$2c(a1)
  78.           jsr     _LVODoIo(a6)    get sectors
  79.  
  80.           lea     diskio(pc),a1
  81.           move.w  #9,$1c(a1)      command motor off
  82.           clr.l   $24(a1)
  83.           jsr     _LVODoIo(a6)
  84.  
  85.           lea     reply(pc),a1
  86.           jsr     _LVORemPort(a6)  remove reply port
  87.  
  88.           lea     diskio(pc),a1
  89.           jsr     _LVOCloseDevice(a6)
  90.  
  91.           movea.l a5,a1           write SECTOR
  92.           lea     Sector(pc),a0
  93.           moveq   #3,d0
  94. loop1     move.l  (a0)+,(a1)+
  95.           dbra    d0,loop1
  96.  
  97.           movea.l a5,a1           write sector number
  98.           adda.l  #7,a1
  99.           movea.l (a7)+,a0
  100. loop2     move.b  (a0)+,d0
  101.           cmpi.b  #$a,d0
  102.           beq.s   next
  103.           move.b  d0,(a1)+
  104.           bra.s   loop2
  105.  
  106. next      movea.l a5,a1           write *******
  107.           adda.l  #$410,a1
  108.           lea     SecNum(pc),a0
  109.           moveq   #3,d0
  110.  
  111. loop3     move.l  (a0)+,(a1)+
  112.           dbra    d0,loop3
  113.           bra.s   fin
  114. error     move.w  (a7)+,d0
  115.           movea.l (a7)+,a0
  116.           suba.l  a0,a0
  117. fin       rts
  118.  
  119. *********************
  120. * Load file
  121. *
  122. * IN:
  123. * a0 Pointer to null terminated filename
  124. *
  125. * OUT:
  126. * d7 <> 0 if error
  127. * a3 Pointer to begin of file
  128. *
  129. *********************
  130.  
  131. file      move.l  a0,-(a7)
  132.  
  133.           suba.l  a5,a5
  134.           suba.l  a4,a4
  135.           moveq   #10,d7
  136.  
  137.           movea.l _AbsExecBase,a6  load dos.library
  138.           lea     DosName(pc),a1
  139.           moveq   #0,d0
  140.           jsr     _LVOOpenLibrary(a6)
  141.           movea.l d0,a6
  142.           tst.l   d0
  143.           beq.s   err
  144.  
  145. ************************************
  146. *
  147. * try to load the file as a program
  148. *
  149. ************************************
  150.  
  151.           move.l  (a7),d1
  152.           jsr     _LVOLoadSeg(a6)
  153.           tst.l   d0
  154.           beq.s   text
  155.           move.l  d0,d1
  156.           add.l   d0,d0
  157.           add.l   d0,d0
  158.           addq.l  #4,d0
  159.           movea.l d0,a3
  160.           jsr     _LVOUnLoadSeg(a6)
  161.           move.l  (a7)+,d1
  162.           moveq   #0,d7
  163.           bra.s   nounlock
  164.  
  165. ************************************
  166. *
  167. * now try to load the file as text
  168. *
  169. ************************************
  170.  
  171.  
  172. text      move.l  (a7),d1          get lock
  173.           moveq   #-2,d2
  174.           jsr     _LVOLock(a6)
  175.           move.l  d0,d1
  176.           movea.l d0,a5
  177.           beq.s   err
  178.  
  179.           suba.l  #$104,a7
  180.           move.l  a7,d2
  181.           jsr     _LVOExamine(a6)
  182.           tst.l   d0
  183.           beq.s   err
  184.  
  185.           move.l  $7c(a7),d0
  186.           adda.l  #$104,a7
  187.           move.l  d0,d5
  188.           beq.s   err
  189.  
  190.           move.l  a6,-(a7)
  191.           moveq   #0,d1            Any type of memory
  192.           movea.l _AbsExecBase,a6
  193.           jsr     _LVOAllocMem(a6)
  194.           movea.l (a7)+,a6
  195.           movea.l d0,a3
  196.           beq.s   err
  197.  
  198.           move.l  (a7),d1
  199.           move.l  #$3ed,d2
  200.           jsr     _LVOOpen(a6)
  201.           movea.l d0,a4
  202.           move.l  d0,d1
  203.           beq.s   err
  204.  
  205.           move.l  a3,d2
  206.           move.l  d5,d3
  207.           jsr     _LVORead(a6)
  208.           cmp.l   d0,d3
  209.           bne.s   err
  210.  
  211.           moveq   #0,d7
  212.           bra.s   errend
  213.  
  214. err       moveq   #1,d7
  215.  
  216. errend    move.l  (a7)+,d0
  217.           move.l  a4,d1
  218.           beq.s   noclose
  219.           jsr     _LVOClose(a6)
  220.  
  221. noclose   move.l  a5,d1
  222.           beq.s   nounlock
  223.           jsr     _LVOUnLock(a6)
  224.  
  225. nounlock  movea.l a6,a1             Close dos.library
  226.           beq.s   nolib
  227.           move.l  _AbsExecBase,a6
  228.           jsr     _LVOCloseLibrary(a6)
  229. nolib     rts
  230.  
  231. DosName   dc.b 'dos.library',0
  232.           even
  233. trddevice dc.b 'trackdisk.device',0
  234.           even
  235. diskio    dc.l 0             +0  successor
  236.           dc.l 0             +4  predecessor
  237.           dc.b 0,0           +8  type,priority
  238.           dc.l 0             +a  pointer to device name
  239.           dc.l 0             +e  reply port
  240.           dc.w reply-diskio  +12 node length
  241.           dc.l 0             +14 io-device
  242.           dc.l 0             +18 io-unit
  243.           dc.w 0             +1c io-command
  244.           dc.b 0,0           +1e flags,error
  245.           dc.l 0             +20 actual no of bytes
  246.           dc.l 0             +24 requested no of bytes
  247.           dc.l 0             +28 pointer to buffer
  248.           dc.l 0             +2c offset
  249. reply     dc.l 0,0,0,0,0,0,0,0
  250.  
  251.  
  252. Sector    dc.b 'SECTOR *'
  253. SecNum    dc.b '****************'
  254.           end
  255.  
  256.